/**
 * Fichier ServiceEnseignement.java : Définition de classe
 * fr.unice.gnpt.core.ServiceEnseignement : Service de type enseignement
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.core;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;

/**
 * Classe gérant les services d'enseignement pour un professeur associé à un
 * cours.
 * <p>
 * Un service d'enseignement permet d'associer un cours à un enseignant.
 * L'enseignant a alors la possibilité d'avoir en charge le cours magistral, un
 * certain nombre de groupes de travaux dirigés et de travaux pratiques.
 * 
 * @author gnpt
 * @version 0.0.2
 */
@Entity
@DiscriminatorValue("SE")
public class Enseignement extends Service {
	private Cours cours;
	private int nbGroupesTDEnCharge;
	private int nbGroupesTPEnCharge;
	private boolean CMEnCharge;

	/**
	 * Constructeur par défaut.
	 * 
	 * @param enseignant
	 *            l'enseignant associé à l'enseignement.
	 * @param cours
	 *            le cours associé à l'enseignement.
	 */
	public Enseignement(Enseignant enseignant, Cours cours) {
		super(enseignant);
		this.cours = cours;
	}

	/**
	 * Constructeur par défaut.
	 */
	public Enseignement() {
		super();
	}

	/**
	 * Accesseur pour récupérer le cours associé au service.
	 * 
	 * @return le cours associé au service.
	 */
	@ManyToOne(cascade = CascadeType.PERSIST)
	public Cours getCours() {
		return this.cours;
	}

	/**
	 * Accesseur pour le nombre de groupes de TD dont l'enseignant en charge
	 * doit s'occuper.
	 * 
	 * @return le nombre de groupes de TD dont l'enseignant en charge doit
	 *         s'occuper.
	 */
	public int getNbGroupesTDEnCharge() {
		return this.nbGroupesTDEnCharge;
	}

	/**
	 * Accesseur pour le nombre de groupes de TP dont l'enseignant en charge
	 * doit s'occuper.
	 * 
	 * @return le nombre de groupes de TP dont l'enseignant en charge doit
	 *         s'occuper.
	 */
	public int getNbGroupesTPEnCharge() {
		return this.nbGroupesTPEnCharge;
	}

	/**
	 * Accesseur indiquant si l'enseignant en charge doit s'occuper du cours
	 * magistral.
	 * 
	 * @return le cMEnCharge
	 */
	public boolean isCMEnCharge() {
		return this.CMEnCharge;
	}

	/**
	 * Mutateur pour le cours auquel est associé le service.
	 * 
	 * @param cours
	 *            le nouveau cours auquel est associé le service.
	 */
	public void setCours(Cours cours) {
		this.cours = cours;
	}

	/**
	 * Mutateur pour le nombre de groupes de TD dont l'enseignant à en charge.
	 * 
	 * @param nbGroupesTDEnCharge
	 *            le nouveau nombre de groupes de TD dont l'enseignant à en
	 *            charge.
	 */
	public void setNbGroupesTDEnCharge(int nbGroupesTDEnCharge) {
		this.nbGroupesTDEnCharge = nbGroupesTDEnCharge;
	}

	/**
	 * Mutateur pour le nombre de groupes de TP dont l'enseignant à en charge.
	 * 
	 * @param nbGroupesTPEnCharge
	 *            le nouveau nombre de groupes de TP dont l'enseignant à en
	 *            charge.
	 */
	public void setNbGroupesTPEnCharge(int nbGroupesTPEnCharge) {
		this.nbGroupesTPEnCharge = nbGroupesTPEnCharge;
	}

	/**
	 * Mutateur pour le cours magistral dont l'enseignant peut avoir en charge.
	 * 
	 * @param enCharge
	 *            booléen indiquant si l'enseignant associé au service a le
	 *            cours magistral en charge.
	 */
	public void setCMEnCharge(boolean enCharge) {
		this.CMEnCharge = enCharge;
	}

	/**
	 * @see fr.unice.gnpt.core.Service#toString()
	 */
	@Override
	public String toString() {
		return super.toString() + " de '" + this.cours + "'";
	}

	/**
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Enseignement) {
			Enseignement e = (Enseignement) obj;
			return ((this.getEnseignant().equals((e.getEnseignant())))
					&& (this.getCours().equals(e.getCours()))
					&& (this.getNbGroupesTDEnCharge() == e.getNbGroupesTDEnCharge())
					&& (this.getNbGroupesTPEnCharge() == e.getNbGroupesTPEnCharge())
					&& (this.isCMEnCharge() == e.isCMEnCharge()));
		}
		return false;
	}
}
